<!doctype html>
<html lang="zh-CN">
<head>
	<meta charset="utf-8">
	<title>Laravel - 为 WEB 艺术家创造的 PHP 框架。 | Laravel 中文网</title>
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta name="author" content="Laravel 中文网">
	<meta name="description" content="Laravel - 为 WEB 艺术家创造的 PHP 框架。| Laravel 中文网">
	<meta name="keywords" content="Laravel中文社区,php框架,laravel中文网,php framework,restful routing,laravel,laravel php">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<!--[if lte IE 9]>
		<script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<![endif]-->
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="stylesheet" href="../../assets/css/laravel.css">
</head>
<body class="docs language-php">

	<span class="overlay"></span>

	<nav class="main">
		<div class="container">
			<a href="../../index.html" class="brand">
				<img src="../../assets/img/laravel-logo.png" height="30">
				Laravel
			</a>

			<div class="responsive-sidebar-nav">
				<a href="#" class="toggle-slide menu-link btn">&#9776;</a>
			</div>

				<div class="switcher">
					<div class="dropdown">
						<button class="btn dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
							<!--<span class="faint">v</span> -->
							4.2
							<span class="caret"></span>
						</button>
						<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../5.0/index.html">5.0</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="index.html">4.2</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../4.1/index.html">4.1</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../4.0/index.html">4.0</a>
								</li>
						</ul>
					</div>
				</div>

			<ul class="main-nav">
				<li class="nav-docs"><a href="../index.html">中文文档</a></li>
				<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
				<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
				<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
				<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
				
			</ul>
		</div>
	</nav>

		<nav id="slide-menu" class="slide-menu" role="navigation">
		
		<div class="brand">
			<a href="../../index.html">
				<img src="../../assets/img/laravel-logo-white.png" height="50">
			</a>
		</div>

		<ul class="slide-main-nav">
			<li><a href="../../index.html">首页</a></li>
			<li class="nav-docs"><a href="../index.html">中文文档</a></li>
			<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
			<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
			<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
			<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
			
		</ul>

		<div class="slide-docs-nav">
			<h2>文档目录</h2>
			<ul>
<li>序言
<ul>
<li><a href="introduction.html">简介</a></li>
<li><a href="quick.html">快速入门</a></li>
<li><a href="releases.html">版本说明</a></li>
<li><a href="upgrade.html">升级指南</a></li>
<li><a href="contributions.html">贡献指南</a></li>
</ul>
</li>
<li>开始学习
<ul>
<li><a href="installation.html">安装</a></li>
<li><a href="configuration.html">配置</a></li>
<li><a href="homestead.html">Homestead 开发环境部署工具</a></li>
<li><a href="lifecycle.html">请求的生命周期</a></li>
<li><a href="routing.html">路由</a></li>
<li><a href="requests.html">请求与输入</a></li>
<li><a href="responses.html">视图与响应</a></li>
<li><a href="controllers.html">控制器</a></li>
<li><a href="errors.html">错误与日志</a></li>
</ul>
</li>
<li>深度历险
<ul>
<li><a href="security.html">身份验证</a></li>
<li><a href="billing.html">计费</a></li>
<li><a href="cache.html">缓存</a></li>
<li><a href="extending.html">核心扩展</a></li>
<li><a href="events.html">事件</a></li>
<li><a href="facades.html">Facades</a></li>
<li><a href="html.html">表单与 HTML</a></li>
<li><a href="helpers.html">有用的工具函数</a></li>
<li><a href="ioc.html">IoC 容器</a></li>
<li><a href="localization.html">本地化</a></li>
<li><a href="mail.html">Mail</a></li>
<li><a href="packages.html">扩展包开发</a></li>
<li><a href="pagination.html">分页</a></li>
<li><a href="queues.html">队列</a></li>
<li><a href="security.html">安全</a></li>
<li><a href="session.html">Session</a></li>
<li><a href="ssh.html">SSH</a></li>
<li><a href="templates.html">模板</a></li>
<li><a href="testing.html">单元测试</a></li>
<li><a href="validation.html">校验</a></li>
</ul>
</li>
<li>数据库
<ul>
<li><a href="database.html">基本用法</a></li>
<li><a href="queries.html">查询构造器</a></li>
<li><a href="eloquent.html">Eloquent ORM</a></li>
<li><a href="schema.html">结构生成器</a></li>
<li><a href="migrations.html">迁移与数据填充</a></li>
<li><a href="redis.html">Redis</a></li>
</ul>
</li>
<li>Artisan 命令行工具
<ul>
<li><a href="artisan.html">概览</a></li>
<li><a href="commands.html">Artisan 扩展开发</a></li>
</ul>
</li>
<li><a href="contributors.html">中文文档贡献者名单</a></li>
</ul>

		</div>

	</nav>

	<div class="docs-wrapper container">

		<section class="sidebar">
			<ul>
<li>序言
<ul>
<li><a href="introduction.html">简介</a></li>
<li><a href="quick.html">快速入门</a></li>
<li><a href="releases.html">版本说明</a></li>
<li><a href="upgrade.html">升级指南</a></li>
<li><a href="contributions.html">贡献指南</a></li>
</ul>
</li>
<li>开始学习
<ul>
<li><a href="installation.html">安装</a></li>
<li><a href="configuration.html">配置</a></li>
<li><a href="homestead.html">Homestead 开发环境部署工具</a></li>
<li><a href="lifecycle.html">请求的生命周期</a></li>
<li><a href="routing.html">路由</a></li>
<li><a href="requests.html">请求与输入</a></li>
<li><a href="responses.html">视图与响应</a></li>
<li><a href="controllers.html">控制器</a></li>
<li><a href="errors.html">错误与日志</a></li>
</ul>
</li>
<li>深度历险
<ul>
<li><a href="security.html">身份验证</a></li>
<li><a href="billing.html">计费</a></li>
<li><a href="cache.html">缓存</a></li>
<li><a href="extending.html">核心扩展</a></li>
<li><a href="events.html">事件</a></li>
<li><a href="facades.html">Facades</a></li>
<li><a href="html.html">表单与 HTML</a></li>
<li><a href="helpers.html">有用的工具函数</a></li>
<li><a href="ioc.html">IoC 容器</a></li>
<li><a href="localization.html">本地化</a></li>
<li><a href="mail.html">Mail</a></li>
<li><a href="packages.html">扩展包开发</a></li>
<li><a href="pagination.html">分页</a></li>
<li><a href="queues.html">队列</a></li>
<li><a href="security.html">安全</a></li>
<li><a href="session.html">Session</a></li>
<li><a href="ssh.html">SSH</a></li>
<li><a href="templates.html">模板</a></li>
<li><a href="testing.html">单元测试</a></li>
<li><a href="validation.html">校验</a></li>
</ul>
</li>
<li>数据库
<ul>
<li><a href="database.html">基本用法</a></li>
<li><a href="queries.html">查询构造器</a></li>
<li><a href="eloquent.html">Eloquent ORM</a></li>
<li><a href="schema.html">结构生成器</a></li>
<li><a href="migrations.html">迁移与数据填充</a></li>
<li><a href="redis.html">Redis</a></li>
</ul>
</li>
<li>Artisan 命令行工具
<ul>
<li><a href="artisan.html">概览</a></li>
<li><a href="commands.html">Artisan 扩展开发</a></li>
</ul>
</li>
<li><a href="contributors.html">中文文档贡献者名单</a></li>
</ul>

		</section>

		<article>
			<h1>升级指南</h1>
<ul>
<li><a href="#upgrade-4.2">从4.1升级到4.2</a></li>
<li><a href="#upgrade-4.1.29">从小于等于4.1.x升级到4.1.29</a></li>
<li><a href="#upgrade-4.1.26">从小于等于4.1.25升级到4.1.26</a></li>
<li><a href="#upgrade-4.1">从4.0升级到4.1</a></li>
</ul>
<p><a name="upgrade-4.2"></a></p>
<h2>从4.1升级到4.2</h2>
<h3>PHP 5.4+</h3>
<p>Laravel 4.2需要PHP 5.4.0或更高版本。</p>
<h3>加密的默认设置</h3>
<p>在配置文件“app/config/app.php”里添加一个新的选项“cipher”。 此选项的值应该是“MCRYPT_RIJNDAEL_256”。</p>
<pre><code>'cipher' =&gt; MCRYPT_RIJNDAEL_256
</code></pre>
<p>这个设置可以用来控制Laravel加密功能使用默认密钥。</p>
<blockquote>
<p><strong>Note:</strong> In Laravel 4.2, the default cipher is <code>MCRYPT_RIJNDAEL_128</code> (AES), which is considered to be the most secure cipher. Changing the cipher back to <code>MCRYPT_RIJNDAEL_256</code> is required to decrypt cookies/values that were encrypted in Laravel &lt;= 4.1</p>
</blockquote>
<h3>软删除模型现在的使用特性</h3>
<p>如果你正在使用软删除模型，“softDeletes”属性已经被删除了。现在你应该使用“SoftDeletingTrait”属性，像下面这样：</p>
<pre><code>use Illuminate\Database\Eloquent\SoftDeletingTrait;

class User extends Eloquent {
    use SoftDeletingTrait;
}
</code></pre>
<p>你还应该手动添加“deleted_at”列到“dates”属性上：</p>
<pre><code>class User extends Eloquent {
    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];
}
</code></pre>
<p>所有软删除操作的API保持不变。</p>
<blockquote>
<p><strong>Note:</strong> The <code>SoftDeletingTrait</code> can not be applied on a base model. It must be used on an actual model class.</p>
</blockquote>
<h3>重命名的视图/分页环境</h3>
<p>如果你直接的引用了“Illuminate\View\Environment”类或“Illuminate\Pagination\Environment”类，升级你的代码，用“Illuminate\View\Factory”和“Illuminate\Pagination\Factory”来替代。原来的两个类已经被重命名,以更好地反映其功能。</p>
<h3>分页呈现时的额外参数</h3>
<p>如果你扩展了“Illuminate\Pagination\Presenter”类，它的抽象方法“getPageLinkWrapper”的签名已经被改变了，添加了“ref”参数：</p>
<pre><code>abstract public function getPageLinkWrapper($url, $page, $rel = null);
</code></pre>
<h3>Iron.Io Queue Encryption</h3>
<p>If you are using the Iron.io queue driver, you will need to add a new <code>encrypt</code> option to your queue configuration file:</p>
<pre><code>'encrypt' =&gt; true
</code></pre>
<p><a name="upgrade-4.1.29"></a></p>
<h2>从小于等于4.1.x升级到4.1.29</h2>
<p>Laravel 4.1.29改善了所有的数据库驱动程序的列引用。当模型“不”使用“fillable”属性时，它保护您的应用程序免受某个mass assignment漏洞。 如果你在模型上使用了“fillable”属性来防止mass assignemnt漏洞，你的应用程序就是不易受攻击的。然而，如果你正在使用“guarded”，同时传递了一个用户控制的数组给“update”或“save”类型的函数，你应该立即升级到“4.1.29”，因为你的应用程序可能面临“mass assignment”漏洞的风险。</p>
<p>要升级到Laravel 4.1.29，简单的执行“composer update”命令即可。这个版本中没有引入重大的改变。</p>
<p><a name="upgrade-4.1.26"></a></p>
<h2>从小于等于4.1.25升级到4.1.26</h2>
<p>Laravel 4.1.26为cookies引入了安全方面的改进。在此更新之前，如果一个cookie被另一个恶意用户劫持，这个cookie将长期有效，即使此账户真正的所有者进行了重置密码、退出登录等操作.</p>
<p>这项改变需要在你的数据表“users”（或等价的表）添加一个新的列“remember_token”。 在这项改变之后，每次用户登录你的应用程序时都会被分配给一个新的token。当此用户从应用程序退出时，token也将被更新。这项改变的意义是： 当cookie被劫持，简单的退出应用程序也会使cookie失效。</p>
<h3>升级路线</h3>
<p>首先，添加一个新的可为空的列“remember_token”到你的“users”表里， 其类型为VARCHAR(100)，或TEXT，或等价的类型。</p>
<p>接下来，如果你使用了Eloquent认证驱动，用下面三个方法来更新你的“User”类：</p>
<pre><code>public function getRememberToken()
{
    return $this-&gt;remember_token;
}

public function setRememberToken($value)
{
    $this-&gt;remember_token = $value;
}

public function getRememberTokenName()
{
    return 'remember_token';
}
</code></pre>
<blockquote>
<p><strong>注意：</strong> 这项改变将使所有存在的session失效，所以，所有的用户将被迫在你的应用程序上重新认证。</p>
</blockquote>
<h3>包维护者</h3>
<p>两个新方法被加入到了“Illuminate\Auth\UserProviderInterface”接口里。默认的驱动里可以找到实现的示例：</p>
<pre><code>public function retrieveByToken($identifier, $token);

public function updateRememberToken(UserInterface $user, $token);
</code></pre>
<p>“Illuminate\Auth\UserInterface”接口也添加了“升级路线”里描述的三个新方法。</p>
<p><a name="upgrade-4.1"></a></p>
<h2>从4.0升级到4.1</h2>
<h3>升级你的Composer依赖</h3>
<p>要升级你的应用程序到Laravel 4.1，把“composer.json”文件里的“laravel/framework”的版本改成“4.1.*”。</p>
<h3>替换文件</h3>
<p>用仓库里的最新副本替换你的“public/index.php”文件（https://github.com/laravel/laravel/blob/master/public/index.php）。</p>
<p>用仓库里的最新副本替换你的“artisan”文件（https://github.com/laravel/laravel/blob/master/artisan）。</p>
<h3>添加配置文件和选项</h3>
<p>更新你的配置文件“app/config/app.php”里的“aliases”和“providers”数组。在文档（https://github.com/laravel/laravel/blob/master/app/config/app.php）里能找到这两个数组更新过的值。一定要把你自己的定制和包服务加回到providers/aliases数组里。</p>
<p>从仓库里添加新的文件“app/config/remote.php”（https://github.com/laravel/laravel/blob/master/app/config/remote.php）.</p>
<p>在你的文件“app/config/session.php”里添加新的配置项“expire_on_close”，默认值应该是“false”。</p>
<p>在你的文件“app/config/queue.php”里添加新的配置章节“failed”。 下面是此章节的默认值：</p>
<pre><code>'failed' =&gt; array(
    'database' =&gt; 'mysql', 'table' =&gt; 'failed_jobs',
),
</code></pre>
<p><strong>（可选）</strong> 在你的文件“app/config/view.php”里把配置项“pagination”更新为“pagination::slider-3”。</p>
<h3>控制器更新</h3>
<p>如果“app/controllers/BaseController.php”文件的顶部有使用声明，把“use Illuminate\Routing\Controllers\Controller;”改为“use Illuminate\Routing\Controller;”。</p>
<h3>密码提醒更新</h3>
<p>为了更加灵活，密码提醒被彻底修改了。 通过运行Artisan命令“php artisan auth:reminders-controller”，你可以检查新的存根控制器。你也可以浏览更新文档（/docs/security#password-reminders-and-reset），并按照文档来更新你的应用程序。</p>
<p>更新你的语言文件“app/lang/en/reminders.php”，使其与文件（https://github.com/laravel/laravel/blob/master/app/lang/en/reminders.php）相匹配。</p>
<h3>环境检测更新</h3>
<p>由于安全的原因，URL域不再被用来检测你的应用程序环境。这些值是容易欺骗的，并允许攻击者修改请求环境。你应该把你的环境检测转换成机器主机名（在命令行界面执行“hostname”命令，适用于Mac，Linux，和Windows）。</p>
<h3>更简单的日志文件</h3>
<p>Laravel现在生成一个单独的日志文件“app/storage/logs/laravel.log”。然而，你还可以在文件“app/start/global.php”里配置此行为。</p>
<h3>删除重定向末尾斜杠</h3>
<p>在你的文件“bootstrap/start.php”里，删除此句调用“$app-&gt;redirectIfTrailingSlash()”，这个方法不再需要了，因为它的功能被框架里的“.htaccess”文件负责了。</p>
<p>接下来，把你的Apache的“.htaccess”文件替换成新的（https://github.com/laravel/laravel/blob/master/public/.htaccess）， 这个文件是用来处理尾部斜杠的。</p>
<h3>当前路由访问</h3>
<p>现在通过“Route::current()”来访问当前路由，替换掉原来的“Route::getCurrentRoute()”。</p>
<h3>Composer更新</h3>
<p>一旦你完成了上面的更改，你就能运行“composer update”命令来更新你的核心应用程序文件了！如果你收到类加载错误，试着运行启用“--no-scripts”选项的更新命令，就像这样：“composer update --no-scripts”。</p>
<h3>通配符事件监听器</h3>
<p>通配符事件监听器不再附加事件到你的处理函数的参数里。如果你需要找到被触发的事件，你应该使用“Event::firing()”。</p>

		</article>
	</div>


	<footer class="main">
		<ul>
			<li class="nav-docs"><a href="../index.html">中文文档</a></li>
			<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
			<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
			<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
			<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
			
		</ul>
		<p>Laravel is a trademark of Taylor Otwell. Copyright &copy; Taylor Otwell.</p>
		<p class="less-significant"><a href="http://jackmcdade.com" target="_blank">Design by Jack McDade</a></p>
	</footer>

	<script src="../../assets/js/laravel.js"></script>
	<script src="../../assets/js/viewport-units-buggyfill.js"></script>
	<script>window.viewportUnitsBuggyfill.init();</script>
	<script type="text/javascript">
	var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
	document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fc8d13872a523d9c286aa7affbe0921f1' type='text/javascript'%3E%3C/script%3E"));
	</script>
</body>
</html>
